#!/bin/bash
set -euo pipefail

# 颜色
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 默认参数（根据你的 docker-compose 预置）
CONTAINER_NAME="fastapi_mysql"
DB_NAME="fastapi_auth"
DB_USER="root"
DB_PASSWORD=""
OUTPUT_DIR="./sql_exports/prod"
ENABLE_GZIP="false"

usage() {
  cat <<'USAGE'
用法: export_prod_from_container.sh [选项]

可选项（若不传将使用默认值）:
  -c <container>   容器名，默认 fastapi_mysql
  -d <database>    数据库名，默认 fastapi_auth
  -u <user>        数据库用户，默认 root
  -p <password>    数据库密码（不传则安全提示输入）
  -o <output_dir>  导出目录，默认 ./sql_exports/prod
  --gzip           导出后使用 gzip 压缩为 .sql.gz
  -h, --help       查看帮助

示例:
  ./export_prod_from_container.sh
  ./export_prod_from_container.sh -o ./backup --gzip
  ./export_prod_from_container.sh -c my_mysql -d mydb -u admin -p 'secret' --gzip
USAGE
}

# 解析参数
PARSED=$(getopt -o c:d:u:p:o:h -l gzip,help -- "$@" || true)
eval set -- "$PARSED"
while true; do
  case "$1" in
    -c) CONTAINER_NAME="$2"; shift 2;;
    -d) DB_NAME="$2"; shift 2;;
    -u) DB_USER="$2"; shift 2;;
    -p) DB_PASSWORD="$2"; shift 2;;
    -o) OUTPUT_DIR="$2"; shift 2;;
    --gzip) ENABLE_GZIP="true"; shift 1;;
    -h|--help) usage; exit 0;;
    --) shift; break;;
    *) break;;
  esac
done

# 依赖检查
command -v docker >/dev/null 2>&1 || { echo -e "${RED}未找到 docker 命令${NC}"; exit 1; }

# 容器检查
if ! docker ps --format '{{.Names}}' | grep -qx "$CONTAINER_NAME"; then
  echo -e "${RED}容器 ${CONTAINER_NAME} 未运行${NC}"
  exit 1
fi

# 密码安全输入
if [[ -z "${DB_PASSWORD}" ]]; then
  read -r -s -p "请输入 MySQL 密码 (${DB_USER}@${DB_NAME}): " DB_PASSWORD
  echo ""
fi

# 准备输出目录与文件名
mkdir -p "${OUTPUT_DIR}"
TS=$(date +%Y%m%d_%H%M%S)
BASENAME="prod_${DB_NAME}_${TS}.sql"
HOST_SQL_PATH="${OUTPUT_DIR}/${BASENAME}"
CONTAINER_SQL_PATH="/tmp/${BASENAME}"

echo -e "${BLUE}=== 容器内导出开始 ===${NC}"
echo -e "${YELLOW}容器: ${CONTAINER_NAME}${NC}"
echo -e "${YELLOW}数据库: ${DB_NAME}${NC}"

# 在容器内执行 mysqldump，使用 MYSQL_PWD 避免密码出现在进程参数中
DUMP_CMD="mysqldump -u${DB_USER} --single-transaction --routines --triggers --events ${DB_NAME} > ${CONTAINER_SQL_PATH}"
if ! docker exec -e MYSQL_PWD="${DB_PASSWORD}" "${CONTAINER_NAME}" sh -c "${DUMP_CMD}"; then
  echo -e "${RED}导出失败：请检查数据库名/用户/密码${NC}"
  exit 1
fi

# 将文件拷贝到宿主机
docker cp "${CONTAINER_NAME}:${CONTAINER_SQL_PATH}" "${HOST_SQL_PATH}"

# 清理容器内临时文件
docker exec "${CONTAINER_NAME}" rm -f "${CONTAINER_SQL_PATH}" || true

# 可选压缩
if [[ "${ENABLE_GZIP}" == "true" ]]; then
  gzip -f "${HOST_SQL_PATH}"
  HOST_SQL_PATH="${HOST_SQL_PATH}.gz"
fi

echo -e "${GREEN}导出成功: ${HOST_SQL_PATH}${NC}"
if command -v du >/dev/null 2>&1; then
  echo -e "${GREEN}文件大小: $(du -h "${HOST_SQL_PATH}" | awk '{print $1}')${NC}"
fi
echo -e "${BLUE}=== 导出完成 ===${NC}"